package com.yf.gc;

/**
 * -XX:+PrintGCDetails
 */
public class LocalVarGC {
    public static void main(String[] args) {
        LocalVarGC localVarGC = new LocalVarGC();
        localVarGC.test();
    }

    public void test() {
        byte[] buf = new byte[10 * 1024 * 1024];
        System.gc();
    }

    public void test2() {
        byte[] buf = new byte[10 * 1024 * 1024];
        buf = null;
        System.gc();
    }

    public void test3() {
        {
            byte[] buf = new byte[10 * 1024 * 1024];
        }
        /*
        局部变量表最大长度为2,buf在slot1中，虽然过了作用域，但是slot1中的引用并未失效，不会被gc回收
         */
        System.gc();
    }

    public void test4() {
        {
            byte[] buf = new byte[10 * 1024 * 1024];
        }
        int value = 10;
        /*
        局部变量表的长度为2，buf在slot1中，由于过了作用域，slot1被复用，value替换了buf,所以buf引用的数组失去了引用，就被gc回收了
         */
        System.gc();
    }

    public void test5() {
        test();
        // test方法出栈，局部变量销毁，buf引用的数组失去引用，被gc回收了
        System.gc();
    }

}
